package com.tedu.api.ee;

import org.junit.Test;

/**
 * Java有一套完善的异常处理操作
 * 程序中对应出现什么问题，就会有对应异常【对象】提供出来，错误也是对象！
 *
 * Throwable顶级超类--抛出错误：
 *  子类Exception对象：程序级别的错误(经常遇见)
 *                  编译期--FileOutputStream(编写代码同时，下方波浪线)
 *                  处理方式①：抛出异常：不管什么错误，抛出方法外
 *                         ②：捕获异常：抓到异常，记录异常错误信息
 *                  检查异常：通常由编译器检查处理，存在异常类，抛出、捕获！
 *
 *                  运行期--控制台(IDE开发工具控制台，显示出红色，异常类名字)
 *                  非检查异常：RuntimeException(认为所有异常来自于RuntimeException)
 *                            所有异常都是RuntimeException的子类！
 *
 *  子类Error对象:描述系统级别的错误(不常见)
 *     ----测试：程序挂了？  利用字符串不断拼接--Error
 *     String str="字符串";  直接量写出字符串    ---存常量池
 */
public class EE {
    /**
 * Error级别的错误---递归的方式撑爆栈
 * 1.创建静态方法 method
 * 2.在静态方法中调用method
 * 3.通过testError单元测试--调用EE对象下的method方法
 */
    public static void method(){
        method();
    }
    @Test
    public void testError(){
        EE.method();
    }
    //Exception  检查异常  ---处理手段2： 捕获方式--预判：程序出什么异常

    /**
     *  捕获语法异常：
     *             try{
     *             可能出现的异常代码段中添加
     *             }catch(异常名字 e){
     *                 e.printStackTrace();打印异常信息--
     *                                     方便开发者查询原因
     *             }catch(异常名字【中异常】 e){
     *                 e.printStackTrace();
     *             }catch(异常名字【大异常】 e){
     *                 e.printStackTrace();
     *             }finally{
     *                 捕获异常--必须执行代码块--IO关闭流
     *             }
     *
     *
     *  捕获异常快捷键 ctrl+alt+t    选中可能出现错误的代码块
     */
    @Test
    public void testException(){
        try {
            String s="a";
            //.StringIndexOutOfBoundsException异常--产生原因：字符串下标越界异常
            //异常产生原因：指定下标超出字符串范围
            s.charAt(0);

            //NullPointerException异常---空指针异常
            //该异常产生原因：字符串为空，拿到数值为空时
            s.length();

            //NumberFormatException异常---数值转换异常
            //异常产生原因：将存储的不是整数的字符串，转换为整数
            Integer.parseInt(s);    //a    是整数类型
        }  catch (NumberFormatException e) {//数值转换异常
            e.printStackTrace();//打印异常信息--提供线索
        }  catch (NullPointerException e) {//数值转换异常
            e.printStackTrace();//打印异常信息--提供线索
        }  catch (StringIndexOutOfBoundsException e) {//数值转换异常
            e.printStackTrace();//打印异常信息--提供线索
        }  finally {
            System.out.println("一直执行代码块");
        }
    }


    //作业1：写出代码段5个错误【分开：1次抓一个错误】，使用try--catch捕获打印信息
    public class ErrorCatcher {
        public void main(String[] args) {
            try {
                // 错误 1：数组越界
                int[] arr1 = new int[2];
                System.out.println(arr1[3]);
            } catch (ArrayIndexOutOfBoundsException e) {
                System.out.println("错误 1：数组越界。");
            }

            try {
                // 错误 2：除零错误
                int a = 5 / 0;
            } catch (ArithmeticException e) {
                System.out.println("错误 2：除零错误。");
            }

            try {
                // 错误 3：空指针异常
                String str1 = null;
                System.out.println(str1.length());
            } catch (NullPointerException e) {
                System.out.println("错误 3：空指针异常。");
            }

            try {
                // 错误 4：类型转换错误
                Object obj1 = "abc";
                Integer num1 = (Integer)obj1;
            } catch (ClassCastException e) {
                System.out.println("错误 4：类型转换错误。");
            }
            try {
                // 错误 5：错误的文件路径
                java.io.File file = new java.io.File("nonexistentPath/file.txt");
                java.util.Scanner scanner = new java.util.Scanner(file);
            } catch (java.io.FileNotFoundException e) {
                System.out.println("错误 7：错误的文件路径。");
            }
        }
    }
    //提示：字符串、集合、标准IO、包装类--看API
}



